

//一.类的定义
//1.ts中定义类，与原生js差不多。——!!! 注意ts在声明类的时候，需要对类的属性的数据类型进行约束**
class Person{
    name1:string; //前面省略的public关键词
    constructor(name:string){
     this.name1=name
    }
    run():void{
      console.log(`${this.name1}在工作`);
    }
  
  }
  let p = new Person("张三");
  console.log(p.name1)
  p.run()
  
  
  //2.继承
  class person1{
    name:string;
    constructor(name:string) {
        this.name = name;
    }
    run():string{
        return `${this.name}在跑步`;
    }
  }
  
  let p1 = new person1("王吉");
  console.log(p1.run());
  
  // 继承
  class Web extends person1{
    constructor(name:string) {
        super(name);
    }
  }
  let w = new Web("李四");
  console.log(w.run());
  
  
  //3.ts提供了三种修饰符：
  // public(默认的)： 公有 在类里面、子类类外边都可以访问
  // protected：在类里面、子类里面可以访问、在类外部无法访问
  // private：在类里面可以访问、子类、类外部没法访问
  
  
  //4.静态属性 与静态方法区别
  //4.1 所谓静态方法-当类创建之初，该方法就存在。而对应的实例方法-只有实例化该类的时候，才存在
  function Person2(){
    this.run1=function(){
      console.log('我是实例方法');
    }
  }
  // 静态方法
//   Person2.run2=function(){
//     console.log('我是静态方法');
  
//   } 
  
  // 调用实例方法：(实例化之后才能调用的)
  var p2 = new Person2();
  p2.run1();
  
  // 调用静态方法：
//   Person2.run2()
  
  
  //4.2 另一种方式声明静态方法，利用static关键字声明
  //!!!注意 静态方法里面没法直接调用类里面的属性
  class person3{
    name:string;
    // 静态方法
    static name1:string ="阿巴阿爸"
    constructor(name:string) {
        this.name = name;
    }
    //实例方法
    run():string{
        return `${this.name}在跑步`;
    }
  
    // 静态方法——里面没法直接调用类里面的属性
    static print(){
        return `我叫${this.name1}`;
    }
  }
  
  let p3 = new person3("小甜甜");
  console.log(p3.run());
  console.log(person3.print());
  
  
  
  //5.抽象方法
  //ts中的抽象类，它是提供其他类继承的基类，不能直接被实例化
  // 用abstract关键字定义抽象类和抽象方法，抽象方法只能放在抽象类中
  
  //抽象类-抽象类中必须包含至少一个抽象方法，不然没有意义。也就是说，抽象方法只能出现在抽象类中
  abstract class Animal1{
    name:string;
    constructor(name:string) {
        this.name =name;
    }
  //抽象方法
    abstract eat():any; 
   // abstract eat2():string { return '' }; // 报错：方法“eat”不能具有实现，因为它标记为抽象 。也就是说抽象方法不能有具体体现，只能在派生类(即子类继承)中实现
   
  }
  
  // 抽象类无法直接实例化
  // var a = new Animal();// 会报错
  
  
   // 抽象类的子类必须实现抽象类里面的抽象方法
  class Dog1 extends Animal1{
   
    constructor(name:string) {
        super(name)
    }
    eat(){
        console.log(this.name+"快跑");
        
    }
  }
  
  var d = new Dog1("小狗")
  d.eat();// 小狗快跑
  
  
  
   export {}    